--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_mesh_page_file_path_security.py
Displaying Raw • Download
tests/backend/test_mesh_page_file_path_security.py bce42bcdce0e7d2c6d78228e864a4cd1d974cc82 (bce42bcd) Text, 7.09 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Path traversal and fuzz tests for PageNode and normalize_page_filename."""
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72import T7ee787pytest
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3HealthCheckTb4b4b4, Te6edf3givenTb4b4b4, Te6edf3settings
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3strategies Tff7b72as Te6edf3st
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Tb4b4b4(
Te6edf3PageNodeTb4b4b4,
Te6edf3_safe_mesh_file_basenameTb4b4b4,
Te6edf3normalize_page_filenameTb4b4b4,
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffnode_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3d Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3d
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3dTb4b4b4, Te6edf3ignore_errorsTff7b72=Tff7b72TrueTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_rnsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.page_node.RNSTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mockTb4b4b4:
Te6edf3mock_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_identityTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x01Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_identityTff7b72.Td2a8ffget_public_keyTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x02Ta5d6ff" Tff7b72* T79c0ff64
Te6edf3mock_destination Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_destinationTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x03Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_identity
Te6edf3mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_identity
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_destination
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffIN Tff7b72= T79c0ff1
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLE Tff7b72= T79c0ff0
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALL Tff7b72= T79c0ff0xFF
Te6edf3mockTff7b72.Td2a8ffTransport Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3mockTb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3mock_destination
Tff7b72def Td2a8ff_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Tff7b72return Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6ffsec-test-nodeTa5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffSec TestTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Tb4b4b4)
Te6edf3TRAVERSAL_PAGE_INPUTS Tff7b72= Tb4b4b4[
Ta5d6ff"Ta5d6ff../../etc/passwdTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff..Tffea00\\Ta5d6ff..Tffea00\\Ta5d6ffwindowsTffea00\\Ta5d6ffsystem32Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffpage/../../../secret.muTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff/page/../../../x.muTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffoo/../bar/../baz.muTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff....//....//evil.muTa5d6ff"Tb4b4b4,
Ta5d6ff"Tffea00\0Ta5d6ff../x.muTa5d6ff"Tb4b4b4,
Tb4b4b4]
Tff7b72class T56d364TestPathTraversalKnownVectorsTb4b4b4:
Tff7b72def Td2a8fftest_normalize_strips_to_basenameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3raw Tff7b72in Te6edf3TRAVERSAL_PAGE_INPUTSTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3out Tff7b72= Te6edf3normalize_page_filenameTb4b4b4(Te6edf3rawTb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72continue
Tff7b72assert Te6edf3osTff7b72.Td2a8ffsep Tff7b72not Tff7b72in Te6edf3out
Tff7b72assert Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72not Tff7b72in Te6edf3out
Tff7b72assert Ta5d6ff"Tffea00\\Ta5d6ff" Tff7b72not Tff7b72in Te6edf3out
Tff7b72assert Te6edf3out Tff7b72not Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3outTb4b4b4) Tff7b72== Te6edf3out
Tff7b72def Td2a8fftest_add_page_never_writes_outside_pages_dirTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3raw Tff7b72in Te6edf3TRAVERSAL_PAGE_INPUTSTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3saved Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Te6edf3rawTb4b4b4, Ta5d6ff"Ta5d6ffprobeTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72continue
Te6edf3full Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Te6edf3savedTb4b4b4)Tb4b4b4)
Te6edf3root Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4)
Tff7b72assert Te6edf3full Tff7b72== Te6edf3root Tff7b72or Te6edf3fullTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)Tb4b4b4, Tb4b4b4(Te6edf3rawTb4b4b4, Te6edf3savedTb4b4b4, Te6edf3fullTb4b4b4)
Tff7b72def Td2a8fftest_add_file_rejects_dot_segmentsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ff .. Ta5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_remove_file_dot_segments_returns_falseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_fileTb4b4b4(Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_fileTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_safe_mesh_file_basenameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72assert Te6edf3_safe_mesh_file_basenameTb4b4b4(Ta5d6ff"Ta5d6ffa/b/c.txtTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffc.txtTa5d6ff"
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3_safe_mesh_file_basenameTb4b4b4(Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Tf85149ValueErrorTb4b4b4)Tb4b4b4:
Te6edf3_safe_mesh_file_basenameTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tf0883e@settingsTb4b4b4(Te6edf3max_examplesTff7b72=T79c0ff300Tb4b4b4, Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3nameTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff500Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_normalize_page_filename_never_emits_path_segmentsTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3out Tff7b72= Te6edf3normalize_page_filenameTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72return
Tff7b72assert Te6edf3osTff7b72.Td2a8ffsep Tff7b72not Tff7b72in Te6edf3out
Tff7b72assert Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72not Tff7b72in Te6edf3out
Tff7b72assert Ta5d6ff"Tffea00\\Ta5d6ff" Tff7b72not Tff7b72in Te6edf3out
Tff7b72assert Te6edf3out Tff7b72not Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4)
Tf0883e@settingsTb4b4b4(
Te6edf3max_examplesTff7b72=T79c0ff200Tb4b4b4,
Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3nameTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff500Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_add_page_writes_only_under_pages_dirTb4b4b4(Te6edf3mock_rnsTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3tempfileTff7b72.Td2a8ffTemporaryDirectoryTb4b4b4(Tb4b4b4) Tff7b72as Te6edf3node_dirTb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3saved Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Te6edf3nameTb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72return
Te6edf3full Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Te6edf3savedTb4b4b4)Tb4b4b4)
Te6edf3root Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4)
Tff7b72assert Te6edf3full Tff7b72== Te6edf3root Tff7b72or Te6edf3fullTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)
Tf0883e@settingsTb4b4b4(
Te6edf3max_examplesTff7b72=T79c0ff200Tb4b4b4,
Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tf0883e@givenTb4b4b4(Te6edf3fnameTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4, Te6edf3max_sizeTff7b72=T79c0ff500Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8fftest_add_file_writes_only_under_files_dirTb4b4b4(Te6edf3mock_rnsTb4b4b4, Te6edf3fnameTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3tempfileTff7b72.Td2a8ffTemporaryDirectoryTb4b4b4(Tb4b4b4) Tff7b72as Te6edf3node_dirTb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3saved Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Te6edf3fnameTb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4:
Tff7b72return
Te6edf3full Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Te6edf3savedTb4b4b4)Tb4b4b4)
Te6edf3root Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffrealpathTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4)
Tff7b72assert Te6edf3full Tff7b72== Te6edf3root Tff7b72or Te6edf3fullTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3root Tff7b72+ Te6edf3osTff7b72.Td2a8ffsepTb4b4b4)
Tff7b72class T56d364TestPageRespondersTraversalTb4b4b4:
Tff7b72def Td2a8fftest_page_responder_ignores_path_in_request_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffsafe.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffsafe.muTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/page/../../../etc/passwdTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffokTa5d6ff"
Tff7b72def Td2a8fftest_file_responder_ignores_path_prefix_in_request_pathTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3node_dirTb4b4b4,
Te6edf3mock_rnsTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffblob.binTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_file_responderTb4b4b4(Ta5d6ff"Ta5d6ffblob.binTa5d6ff"Tb4b4b4)
Te6edf3out Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/../blob.binTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3outTb4b4b4, Tffa657listTb4b4b4)
Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fftest_try_serve_local_helpers_strip_traversalTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Local page-node serve uses basenames only; request paths must not escape dirs."""
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Te6edf3app Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3ReticulumMeshChatTb4b4b4)
Te6edf3node Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffrunning Tff7b72= Tff7b72True
Te6edf3nodeTff7b72.Td2a8ffdestination Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\xabTa5d6ff" Tff7b72* T79c0ff16
Te6edf3nodeTff7b72.Td2a8fffiles_dir Tff7b72= Ta5d6ff"Ta5d6ff/tmp/mesh_filesTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ffpages_dir Tff7b72= Ta5d6ff"Ta5d6ff/tmp/mesh_pagesTa5d6ff"
Te6edf3nodeTff7b72.Td2a8ff_stats Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6fffiles_servedTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4, Ta5d6ff"Ta5d6ffpages_servedTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4}
Te6edf3nodeTff7b72.Td2a8ffget_page_content Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ffpage okTa5d6ff"Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffpage_node_manager Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3appTff7b72.Td2a8ffpage_node_managerTff7b72.Td2a8ffnodes Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ff1Ta5d6ff"Tb4b4b4: Te6edf3nodeTb4b4b4}
Te6edf3dh Tff7b72= Te6edf3nodeTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash
Te6edf3file_out Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff_try_serve_local_page_node_fileTb4b4b4(
Te6edf3appTb4b4b4,
Te6edf3dhTb4b4b4,
Ta5d6ff"Ta5d6ff/file/../..Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3file_out Tff7b72is Tff7b72None
Te6edf3page_out Tff7b72= Te6edf3ReticulumMeshChatTff7b72.Td2a8ff_try_serve_local_page_nodeTb4b4b4(
Te6edf3appTb4b4b4,
Te6edf3dhTb4b4b4,
Ta5d6ff"Ta5d6ff/page/../../../x.muTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffget_page_contentTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)
Te6edf3called Tff7b72= Te6edf3nodeTff7b72.Td2a8ffget_page_contentTff7b72.Td2a8ffcall_argsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72assert Te6edf3called Tff7b72== Ta5d6ff"Ta5d6ffx.muTa5d6ff"
Tff7b72assert Te6edf3page_out Tff7b72== Ta5d6ff"Ta5d6ffpage okTa5d6ff"
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────